selfhtml.de - Alles für den Webmaster!

 

Anzeige: Goneo - Du machst das Web!

Anzeige: united-domains - Die ganze Welt der Domains

united domains - jetzt Wunsch-Domain sichern!

Einfache & schnelle Domain-Registrierung zu fairen Preisen ohne Einrichtungsgebühren. Mehr als 250 Domain-Endungen aus einer Hand inklusive E-Mail- & Web-Weiterleitung. Einzigartiges Domain-Portfolio zur bequemen & sicheren Verwaltung Ihrer Domain-Namen.

Jetzt Domain-Check bei united-domains!

Problem mit Ersetzen von [ durch <

Autor: FelixF
Datum: 07.02.2010 07:18:58

Hallo alle zusammen,
ich bin mal wieder dabei, an meiner Internetseite zu arbeiten oder besser gesagt, ich bin am basteln und am Dazulernen.

Fuer ein Formular habe ich ueber Javascript das Einfuegen von [u][/u] ermoeglicht. Jetzt wollte ich aber nach dem Abschicken die eckigen Klammern durch "<" bzw. ">" ersetzen. Dies habe ich mit folgender Code versucht:

<?php
$text = $_POST['textfeld'];
echo $text .<br />;
$search = array('/[','/]');
$replace = array('<','>');
$text2 = preg_replace($search,$replace,$text);
echo $text2 ."<br />";
?>

Ich bekomme jedoch folgenden Fehler angezeigt:
Warning pref_match(): Compilation failed: missing terminating ] for character class at offset 3 in C:XAMPP... on line 30

Ich habe es auch schon mit str_replace versucht. Damit funktioniert es auch solange, wie ich NUR eine eckige Klammer schreibe. Sobald ich aber "[u]hallo schreibe", wird mir gar nichts mehr angezeigt. BTW: Bei der Methode habe ich die Backslashs in $search geloescht gehabt.

Kann mir einer vielleicht sagen, was ich aendern muss oder muss ich sogar auf einen besch**** RegEx zurueckgreifen? Ich versteh die Dinger irgendwie einfach nichts. Oder gibt es vielleicht noch eine andere Moeglichkeit?

Danke schonmal im Voraus und liebe Gruesse aus dem warmen aber derzeit regenreichen Australien
Felix



Anzeige: Goneo - Du machst das Web!

Anzeige: united-domains - Die ganze Welt der Domains

united domains - jetzt Wunsch-Domain sichern!

Einfache & schnelle Domain-Registrierung zu fairen Preisen ohne Einrichtungsgebühren. Mehr als 250 Domain-Endungen aus einer Hand inklusive E-Mail- & Web-Weiterleitung. Einzigartiges Domain-Portfolio zur bequemen & sicheren Verwaltung Ihrer Domain-Namen.

Jetzt Domain-Check bei united-domains!

Re: Problem mit Ersetzen von [ durch <

Autor: T.Jung
Datum: 07.02.2010 16:38:56

Zunächst einmal:
Leider »frisst« die Forumssoftware Backslashes. Man muss daher doppelte Backslashes setzen, damit ein einzelner sichtbar wird.
Das macht es natürlich etwas schwierig, Quellcode zu beurteilen, in denen Backslashes wichtig sind; denn ich weiß ja nun nicht, ob Du die Backslashes _tatsächlich_ vergessen hast, oder ob sie halt nur von der Forumssoftware entfernt worden sind.

> <?php
> $text = $_POST['textfeld'];
> echo $text .<br />;
> $search = array('/[','/]');
> $replace = array('<','>');
> $text2 = preg_replace($search,$replace,$text);
> echo $text2 ."<br />";
> ?>
>
> Ich bekomme jedoch folgenden Fehler angezeigt:
> Warning pref_match(): Compilation failed: missing
> terminating ] for character class at offset 3 in
> C:XAMPP... on line 30

Ein regulärer Ausdruck braucht einen »Begrenzer« am Anfang und am Ende -- dazu nimmt man üblicherweise (aber nicht zwangsläufig) den normalen Schrägstrich --; und gewisse Zeichen (die sog. Metazeichen) haben innerhalb von RegEx eine bestimmte Bedeutung -- dazu gehören auch die eckigen Klammern, die eine Zeichenklasse markieren.
Wenn Du diese Zeichen als solche suchen willst, musst Du sie per Backslash »maskieren«, dann weiß die RegEx-Engine: Aha, der will die eckige Klammer gar nicht als Metazeichen vewenden, sondern nach ihnen suchen.

Der Suchstring muss also folgendermaßen lauten:
$search = array('/\[/','/\]/');


> Ich habe es auch schon mit str_replace versucht.
> Damit funktioniert es auch solange, wie ich NUR
> eine eckige Klammer schreibe. Sobald ich aber
> "[u]hallo schreibe", wird mir gar nichts mehr
> angezeigt.

Hmmm?
Folgender Code funktioniert bei mir genauso, wie er soll:

<?php
$text = "[u]hallo[/u]";
$search = array('[', ']');
$replace = array('<','>');

$text2 = str_replace($search, $replace, $text);
echo $text2 . "<br>";
?>


> Kann mir einer vielleicht sagen, was ich aendern
> muss oder muss ich sogar auf einen besch****
> RegEx zurueckgreifen?

Erstens sind RegEx nicht beschissen, sondern ein äußerst hilfreiches und mächtiges Tool.
Zweitens sollte man sie nur einsetzen, a) wenn sie nötig sind, und b) wenn man sie versteht.
a) deshalb, weil sie langsamer sind als die Stringfunktionen;
b) deshalb, weil sie natürlich etwas kompliziert sind und sich deshalb leicht Fehler einschleichen.

Drittens _benutzt_ Du mit preg_replace() ja schon eine RegEx-Funktion, deshalb verstehe ich nicht ganz, warum Du nun fragst ob Du »sogar« darauf zurückgreifen musst...
Und nein, Du brauchst sie hier nicht, denn es geht Dir ja um ein recht einfaches ersetzen (alle eckigen Klammern durch spitze ersetzen); von daher ist hier str_replace() tatsächlich das richtige Mittel.

(Wobei es durchaus berechtigt ist, dass man zum Ersetzen des sog. BB-Codes normalerweise _doch_ RegEx nimmt, aber das ist wieder ein anderes Thema...)


HTH,
Tobias Jung



Anzeige: Goneo - Du machst das Web!

Anzeige: united-domains - Die ganze Welt der Domains

united domains - jetzt Wunsch-Domain sichern!

Einfache & schnelle Domain-Registrierung zu fairen Preisen ohne Einrichtungsgebühren. Mehr als 250 Domain-Endungen aus einer Hand inklusive E-Mail- & Web-Weiterleitung. Einzigartiges Domain-Portfolio zur bequemen & sicheren Verwaltung Ihrer Domain-Namen.

Jetzt Domain-Check bei united-domains!

Re: Problem mit Ersetzen von [ durch <

Autor: FelixF
Datum: 10.02.2010 08:09:08

> Zunächst einmal:
> Leider »frisst« die Forumssoftware Backslashes.
> Man muss daher doppelte Backslashes setzen, damit
> ein einzelner sichtbar wird.
> Das macht es natürlich etwas schwierig, Quellcode
> zu beurteilen, in denen Backslashes wichtig sind;
> denn ich weiß ja nun nicht, ob Du die Backslashes
> _tatsächlich_ vergessen hast, oder ob sie halt
> nur von der Forumssoftware entfernt worden sind.

Nein, ich habe wirklich kein Backslash verwendet, was wohl auch die Ursache war, warum meine Funktion nicht funktioniert hatte.

> Der Suchstring muss also folgendermaßen lauten:
> $search = array('/[/','/]/');

Mit Backslash funktioniert es wunderbar. Danke
  
> Hmmm?
> Folgender Code funktioniert bei mir genauso, wie
> er soll:
>
> <?php
> $text = "[u]hallo[/u]";
> $search = array('[', ']');
> $replace = array('<','>');
>
> $text2 = str_replace($search, $replace, $text);
> echo $text2 . "<br>";
> ?>

Es funkioniert bei mir auch, ich war mal wieder zu schlau ;). Ich habe als Text $text = [u][/u]; verwendet, was soll das denn auch unterstrichen angezeigt werden?

> Erstens sind RegEx nicht beschissen, sondern ein
> äußerst hilfreiches und mächtiges Tool.
> Zweitens sollte man sie nur einsetzen, a) wenn
> sie nötig sind, und b) wenn man sie versteht.

Okay, du hast es gesagt. Sie moegen durchaus ein sehr hilfreichen Tool sein, aber ich ver stehe die Dinger einfach nicht.

> a) deshalb, weil sie langsamer sind als die
> Stringfunktionen;
> b) deshalb, weil sie natürlich etwas kompliziert
> sind und sich deshalb leicht Fehler
> einschleichen.
>
> Drittens _benutzt_ Du mit preg_replace() ja schon
> eine RegEx-Funktion, deshalb verstehe ich nicht
> ganz, warum Du nun fragst ob Du »sogar« darauf
> zurückgreifen musst...

Das zaehlt auch schon als RegEx? Also sobald man die Funktion preg_match verwendet, verwendet man auch automatisch einen RegEx? Dann tut es mir leid fuer emine Unwissenheit, aber ich mag die DInger einfach nicht, weil ich sie eben nicht verstehe.


> (Wobei es durchaus berechtigt ist, dass man zum
> Ersetzen des sog. BB-Codes normalerweise _doch_
> RegEx nimmt, aber das ist wieder ein anderes
> Thema...)

Kennst du vielleicht ein gutes Tutorial, in dem der Umgang mit BB-Code gut erklaert ist?

Danke fuer deine Hilfe
Gruss Felix



Anzeige: Goneo - Du machst das Web!

Anzeige: united-domains - Die ganze Welt der Domains

united domains - jetzt Wunsch-Domain sichern!

Einfache & schnelle Domain-Registrierung zu fairen Preisen ohne Einrichtungsgebühren. Mehr als 250 Domain-Endungen aus einer Hand inklusive E-Mail- & Web-Weiterleitung. Einzigartiges Domain-Portfolio zur bequemen & sicheren Verwaltung Ihrer Domain-Namen.

Jetzt Domain-Check bei united-domains!

Re: Problem mit Ersetzen von [ durch <

Autor: T.Jung
Datum: 10.02.2010 11:41:31

> Das zaehlt auch schon als RegEx? Also sobald man
> die Funktion preg_match verwendet, verwendet man
> auch automatisch einen RegEx?

Nun ja, darüber könnte man streiten: Einerseits ist die Suche nach einem einzelnen Zeichen wohl kein regulärer Ausdruck. Andererseits muss der Suchausdruck natürlich den Syntax-Regeln eines regulären Ausdruck entsprechen, wenn man preg_match() einsetzt -- insofern ist es _doch_ wieder ein RegEx.

Hinzu kommt, dass der PHP-Parser seine RegEx-Engine anwirft, sobald er über einen der preg_(...)-Befehle stolpert. Und das kostet, im Vergleich zu den Stringfunktionen, nun mal Zeit. Klar, wir reden hier über Sekundenbruchteile, aber immerhin sind es in so einem Fall _unnötige_ Sekundenbruchteile; ganz abgesehen davon, dass die Stringfunktionen auch syntaktisch einfacher zu verstehen sind.

Insofern haben die Stringfunktionen, so lange der gewünschte Suchen/Ersetzen-Vorgang mit ihnen realisierbar ist, deutliche Vorteile.


> Kennst du vielleicht ein gutes Tutorial, in dem
> der Umgang mit BB-Code gut erklaert ist?

Nein, leider nicht.
Ich kann Dir allerdings eine fertige Funktion zum Parsen von BB-Code nennen, mit der ich schon erfolgreich gearbeitet habe, nämlich quickerUBB:
http://www.roonaan.nl/hotscripts/index.php
Diese Funktion hat schon ein paar Jahre auf dem Buckel, aber sie funktioniert -- naja, _noch_ funktioniert sie:
Da sie anstelle der Perl-kompatiblen RegEx (preg_) die POSIX-RegEx (ereg_) verwendet und diese in PHP 6 nicht mehr enthalten sein werden, müssten vier Zeilen umgeschrieben werden.
Allerdings dürfte man auch andere fertige Funktionen zu diesem Zweck im Web finden...

Gruß,
Tobias Jung